package com.zdp.leetcodeMiddle;


/*
* 题目描述：
* 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，
* 影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，
* 如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组，
* 计算你不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
示例 1：
输入：[1,2,3,1]
输出：4
解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。
示例 2：
输入：[2,7,9,3,1]
输出：12
解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。
提示：
0 <= nums.length <= 100
0 <= nums[i] <= 400

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 打家劫舍_198 {

    /*
    * 解题思路：  dp[i] : 表示 前i间屋子可以偷盗的最大金额   有两个选中，偷盗第i间
    * 不偷盗第i间   ；  偷盗了第i间，那么第i-1间就不会被偷盗，
    * 不偷盗第i间，那么就是 找到第i-1间的最大金额
    * dp[i] = max(dp[i-2]+nums[i],dp[i-1])
    * 因为选中了第i个，那么 i-1个就不可能被选中  所以只能选中第i-2 个
    * */
    public int rob(int[] nums){
        if(nums.length == 0){
            return 0;
        }
        int[] dp = new int[nums.length];
        for(int i =0;i<nums.length;i++){
            if( i ==0 ){
                dp[i] = nums[i];
            }else if(i == 1){
                dp[i] = Math.max(nums[0],nums[1]);
            }else{
                dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
            }
        }
        return dp[nums.length-1];
    }
}
